/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


package nexus.adec;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import nexus.criterios.GestorCriteriosDB;

/**
 *
 * @author Rodrigo
 */
public class GestorEspacioDB {
    private Coneccion con;
    
    private GestorEspacioDB(){
        con = Coneccion.getInstance();
    }
    
    /**
     * Registra un usuario en el sistema.
     * @param us Es el usuario que se quiere registar.
     * @return true si se registro correctamente y false en caso contrario.
     **/
    public boolean registrarUsuario(Usuario us){
        boolean res;
        try {
            Connection c = con.getConnection();
            PreparedStatement stm = c.prepareStatement("insert into usuario values(?,md5(?),?,?,?,?);");
            stm.setString(1, us.getNombreUsuario());
            stm.setString(2, us.getPasswordUsuario());
            stm.setString(3, us.getNombreCompleto());
            stm.setString(4, us.getEmailUsuario());
            stm.setString(5, us.getDescripcionUsuario());
            stm.setNull(6, Types.BINARY);
            stm.executeUpdate();
            
            stm.close();
            //c.close();
            res = true;
        }catch (Exception ex) {
            ex.printStackTrace();
            res = false;
        }
        return res;
    }
    
    /**
     * Verifica si el nombre de usuario y password son correctos.
     * @param username Es el nombre de usuario.
     * @param password Es el password de usuario.
     * @return true si username y password son correctos y false en caso contrario.
     **/
    public boolean login(String username,String password){
        boolean res;
        try {
            Connection c = con.getConnection();
            PreparedStatement stm = c.prepareStatement("select * from usuario where nombre_usuario=? and password_usuario=md5(?);");
            stm.setString(1, username);
            stm.setString(2, password);
            ResultSet rs = stm.executeQuery();

            res = rs.next();
            
            rs.close();
            stm.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            res = false;
        }
        
        return res;
    }
    
    /**
     * Lista todas las materias registradas en el sistema.
     * @return Un <code>ArrayList</code> con todas las materias registradas.
     **/
    public ArrayList<Materia> listarMaterias(){
        ArrayList<Materia> materias = new ArrayList<Materia>();
        
        try {
            Connection c = con.getConnection();
            PreparedStatement stm = c.prepareStatement("select * from materia;");
            ResultSet rs = stm.executeQuery();

            while(rs.next()){
                materias.add(new Materia(rs.getString("codigo_materia"), rs.getString("nombre_materia"), rs.getString("descripcion_materia")));
            }
            
            rs.close();
            stm.close();
            //c.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return materias;
    }
    
    public ArrayList<Funcion> listarFunciones(){
        ArrayList<Funcion> funciones = new ArrayList<Funcion>();
        
        try {
            Connection c = con.getConnection();
            PreparedStatement stm = c.prepareStatement("select * from funcion;");
            ResultSet rs = stm.executeQuery();

            while(rs.next()){
                funciones.add(new Funcion(rs.getString("codigo_funcion"),rs.getString("nombre_funcion"),rs.getString("descripcion_funcion"),rs.getString("link_funcion"),rs.getString("nombre_categoria")));
            }
            
            stm.close();
            //c.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return funciones;
    }
    
    public String obtenerCodigoEspacio(){
        String res="";
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select nextval('espacio_seq');");
            ResultSet rs =ps.executeQuery();
            if(rs.next()){
                res = "ESP"+rs.getInt(1);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    
    public String crearEspacioCurso(Usuario u,Espacio es){
        String res = "";
        if(validarDatos(u,es)){
        try {
            String codigoEspacio = obtenerCodigoEspacio();
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("insert into espacio_curso values(?,?,?,?);");
            ps.setString(1, codigoEspacio);
            ps.setString(2, es.getNombreEspacio());
            ps.setDate(3, new Date(es.getFechaCreacion().getTime()));
            ps.setString(4, es.getDescripcionEspacio());
            ps.executeUpdate();
            ps.close();
            //c.close();
            
            crearPreferenciasCurso(codigoEspacio, listarWidgets());
            inscribir(codigoEspacio, "Responsable", u.getNombreUsuario());
            asignarFuncionesUsuario(u.getNombreUsuario(), codigoEspacio, listarFuncionesPredeterminadas("Responsable"));
            res = codigoEspacio;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        }
        return res;
    }
    
    public boolean validarDatos(Usuario u,Espacio e){
        boolean res = true;
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from espacio_curso ec,asignacion_espacio ae where ec.codigo_espacio=ae.codigo_espacio and ae.nombre_usuario=?;");
            ps.setString(1, u.getNombreUsuario());
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                if(rs.getString("nombre_espacio").equalsIgnoreCase(e.getNombreEspacio())){
                    res = false;
                }
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public void inscribir(String codigoEspacio,String codigoRol,String nombreUsuario){
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("insert into asignacion_espacio values(?,?,?);");
            ps.setString(1, nombreUsuario);
            ps.setString(2, codigoEspacio);
            ps.setString(3, codigoRol);
            ps.executeUpdate();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    public void asignarFuncionesUsuario(String nombreUsuario,String codigoEspacio,ArrayList<Funcion> funciones){
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("insert into asignacion_funcion values(?,?,?);");
            for(Funcion f:funciones){
                ps.setString(1, nombreUsuario);
                ps.setString(2, codigoEspacio);
                ps.setString(3, f.getCodigoFuncion());
                ps.executeUpdate();
            }
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public ArrayList<Funcion> listarFuncionesPredeterminadas(String nombreRol){
        ArrayList<Funcion> res = listarFunciones();
        return res;
    }
    
    public void crearPreferenciasCurso(String codigoEspacio,ArrayList<Widget> ws){
        try {
            Connection c = con.getConnection();
            for(Widget w:ws){
                PreparedStatement ps = c.prepareStatement("insert into preferencias_espacio values(?,?,?,?);");
                ps.setString(1, codigoEspacio);
                ps.setString(2, w.getNombre());
                ps.setString(3, w.getValor());
                ps.setInt(4, w.getEstado());
                ps.executeUpdate();
                ps.close();
            }
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public ArrayList<EspacioCurso> listarCursos(String nombreUsuario){
        ArrayList<EspacioCurso> cursos = new ArrayList<EspacioCurso>();
        
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from asignacion_espacio ae,espacio_curso ec where ae.codigo_espacio=ec.codigo_espacio and ae.nombre_usuario=?;");
            ps.setString(1, nombreUsuario);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                cursos.add(new EspacioCurso(rs.getString("codigo_espacio"), rs.getString("nombre_espacio"), rs.getDate("fecha_creacion"), rs.getString("descripcion_espacio")));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return cursos;
    }
    
    public boolean cambiarPassword(String nombreUsuario,String oldPassword,String newPassword){
        boolean res;
        try {
            Connection c = con.getConnection();
            Statement st = c.createStatement();
            ResultSet rs = st.executeQuery("select * from usuario where nombre_usuario='"+nombreUsuario+"' and password_usuario=md5('"+oldPassword+"');");
            if(rs.next()){
                st.executeUpdate("update usuario set password_usuario=md5('"+newPassword+"') where nombre_usuario='"+nombreUsuario+"';");
                res = true;
            }else{
                res = false;
            }
            st.close();
            //c.close();
            
        } catch (Exception ex) {
            ex.printStackTrace();
            res= false;
        }
        return res;
    }
    
    public boolean guardarImagen(String nombreUsuario,byte[] buf){
        boolean res;
        String INSERT_PICTURE = "update usuario set imagen_usuario=? where nombre_usuario=?;";
        
	try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement(INSERT_PICTURE);
            ps.setBytes(1, buf);
            ps.setString(2, nombreUsuario);
            ps.executeUpdate();
            ps.close();
            //c.close();
            res = true;
	}catch(Exception ex){
            ex.printStackTrace();
            res = false;
        }
        return res;
    }
    
    public byte[] recuperarImagen(String nombreUsuario){

        byte[] res = null;
        try {
            Connection conn = con.getConnection();
            PreparedStatement st = conn.prepareStatement("select * from usuario where nombre_usuario=?;");
            st.setString(1, nombreUsuario);
            ResultSet rs = st.executeQuery();
            
            if(rs.next()){
                res = rs.getBytes("imagen_usuario");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            res = null;
        }
        return res;
    }
    
    public ArrayList<Funcion> listarFuncionesUsuario(String codigoEspacio,String nombreUsuario){
        ArrayList<Funcion> funciones = new ArrayList<Funcion>();
        if(esResponsable(codigoEspacio, nombreUsuario)){
            funciones = listarFunciones();
        }else{
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from asignacion_funcion af,funcion f where af.codigo_funcion=f.codigo_funcion and nombre_usuario=? and codigo_espacio=?;");
            ps.setString(1, nombreUsuario);
            ps.setString(2, codigoEspacio);
            ResultSet rs = ps.executeQuery();

            while(rs.next()){
                funciones.add(new Funcion(rs.getString("codigo_funcion"),rs.getString("nombre_funcion"),rs.getString("descripcion_funcion"),rs.getString("link_funcion"),rs.getString("nombre_categoria")));
            }

            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        }
        return funciones;
    }
    
    public Carrera obtenerCarrera(String codigoCarrera){
        Carrera res = null;
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from carrera where codigo_carrera=?;");
            ps.setString(1, codigoCarrera);
            ResultSet rs = ps.executeQuery();
            if(rs.next()){
                res = new Carrera(rs.getString("codigo_carrera"), rs.getString("nombre_carrera"),"");
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public Materia obtenerMateria(String mat){
        Materia m = null;
        try {
            Connection c = con.getConnection();
            Statement stm = c.createStatement();
            ResultSet rs = stm.executeQuery("select * from materia where codigo_materia='"+mat+"';");
            
            rs.next();
            m = new Materia(rs.getString("codigo_materia"), rs.getString("nombre_materia"), rs.getString("descripcion_materia"));
            
            rs.close();
            stm.close();
            //c.close();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return m;
    }
    
    public ArrayList<Carrera> listarCarrerasDocente(String codigoDocente){
        ArrayList<Carrera> res = new ArrayList<Carrera>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select distinct(codigo_carrera) from asignacion_docente where nombre_usuario=?;");
            ps.setString(1, codigoDocente);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res.add(obtenerCarrera(rs.getString("codigo_carrera")));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    //lista las materia de un docente que dicta en una carrera.
    public ArrayList<Materia> listarMateriasDocente(String codigoDocente,String codigoCarrera){
        ArrayList<Materia> res = new ArrayList<Materia>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select distinct(codigo_materia) from asignacion_docente where nombre_usuario=? and codigo_carrera=?;");
            ps.setString(1, codigoDocente);
            ps.setString(2, codigoCarrera);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res.add(obtenerMateria(rs.getString("codigo_materia")));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;   
    }
    
    public ArrayList<String> listarGruposDocente(String codigoCarrera,String codigoMateria,String codigoDocente){
        ArrayList<String> res = new ArrayList<String>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select distinct(numero_grupo) from asignacion_docente where nombre_usuario=? and codigo_materia=? and codigo_carrera=?;");
            ps.setString(1, codigoDocente);
            ps.setString(2, codigoMateria);
            ps.setString(3, codigoCarrera);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res.add(rs.getString("numero_grupo"));
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        
        return res;
    }
    
    public ArrayList<Carrera> listarCarrerasEspacio(String codigoEspacio){
        ArrayList<Carrera> res = new ArrayList<Carrera>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select distinct(codigo_carrera) from preferencias_academicas where codigo_espacio=?;");
            ps.setString(1, codigoEspacio);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res.add(obtenerCarrera(rs.getString("codigo_carrera")));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public ArrayList<Materia> listarMateriasEspacio(String codigoEspacio,String codigoCarrera){
        ArrayList<Materia> res = new ArrayList<Materia>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select distinct(codigo_materia) from preferencias_academicas where codigo_espacio=? and codigo_carrera=?;");
            ps.setString(1, codigoEspacio);
            ps.setString(2, codigoCarrera);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res.add(obtenerMateria(rs.getString("codigo_materia")));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public ArrayList<String> listarGruposEspacio(String codigoEspacio,String codigoCarrera,String codigoMateria){
        ArrayList<String> res = new ArrayList<String>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select distinct(numero_grupo) from preferencias_academicas where codigo_espacio=? and codigo_carrera=? and codigo_materia=?;");
            ps.setString(1, codigoEspacio);
            ps.setString(2, codigoCarrera);
            ps.setString(3, codigoMateria);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res.add(rs.getString("numero_grupo"));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    //String codigoEspacio,String codigoMateria,String codigoCarrera,String numeroGrupo
    public void asignarDatosEspacio(String codigoEspacio,ArrayList<GrupoAcademico> grupos){
        try {
            Connection c = con.getConnection();
            Statement stm = c.createStatement();
            stm.executeUpdate("delete from preferencias_academicas where codigo_espacio='"+codigoEspacio+"';");
            stm.close();
            PreparedStatement ps = c.prepareStatement("insert into preferencias_academicas values(?,?,?,?);");
            for(GrupoAcademico g:grupos){
                ps.setString(1, codigoEspacio);
                ps.setString(2, g.getCodigoMateria());
                ps.setString(3, g.getCodigoCarrera());
                ps.setString(4, g.getNumeroGrupo());
                ps.executeUpdate();
            }
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
            
    public boolean estaHabilitado(String codigoEspacio,String codigoCarrera,String codigoMateria,String numeroGrupo){
        boolean res = false;
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from preferencias_academicas where codigo_espacio=? and codigo_carrera=? and codigo_materia=? and numero_grupo=?;");
            ps.setString(1, codigoEspacio);
            ps.setString(2, codigoCarrera);
            ps.setString(3, codigoMateria);
            ps.setString(4, numeroGrupo);
            ResultSet rs = ps.executeQuery();
            res = rs.next();
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public ArrayList<Rol> listarRoles(){
        ArrayList<Rol> roles = new ArrayList<Rol>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from rol;");
            ResultSet rs = ps.executeQuery();
            
            while(rs.next()){
                roles.add(new Rol(rs.getString("codigo_rol"),rs.getString("nombre_rol"),rs.getString("descripcion_rol")));
            }
            
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return roles;
    }
    
    public void registrarDocente(Usuario us){
        if(registrarUsuario(us)){
            try {
                Connection c = con.getConnection();
                PreparedStatement ps = c.prepareStatement("insert into docente values(?)");
                ps.setString(1, us.getNombreUsuario());
                ps.executeUpdate();
                
                ps.close();
                //c.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    
    public ArrayList<Usuario> buscarUsuarios(String codigoEspacio,String nombreUsuario,String param){
        ArrayList<Usuario> res = new ArrayList<Usuario>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select distinct(aa.nombre_usuario) from asignacion_docente ad,asignacion_academica aa where ad.codigo_carrera=aa.codigo_carrera and ad.codigo_materia=aa.codigo_materia and ad.numero_grupo=aa.numero_grupo and ad.nombre_usuario=? and aa.codigo_espacio=?;");
            ps.setString(1, nombreUsuario);
            ps.setString(2, codigoEspacio);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                Usuario u = obtenerUsuario(rs.getString("nombre_usuario"));
                if(u.getNombreUsuario().matches(".*"+param+".*")||u.getNombreCompleto().matches(".*"+param+".*")){
                    res.add(u);
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    /*public ArrayList<Usuario> listarEstudiantesEspacio(String codigoEspacio){
        ArrayList<Usuario> res = new ArrayList<Usuario>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from usuario u,asignacion_espacio ae where u.nombre_usuario=ae.nombre_usuario and ae.codigo_espacio=? and (ae.codigo_rol='Estudiante' or ae.codigo_rol='Auxiliar' or ae.codigo_rol='Invitado');");
            ps.setString(1, codigoEspacio);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res.add(new Usuario(rs.getString("nombre_usuario"),"Encryted with SHA",rs.getString("nombre_completo")));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }*/
    
    public void quitarUsuario(String codigoEspacio,String nombreUsuario){
        try {
            Connection c = con.getConnection();
            Statement stm = c.createStatement();
            stm.executeUpdate("delete from asignacion_funcion where codigo_espacio='"+codigoEspacio+"' and nombre_usuario='"+nombreUsuario+"';");
            stm.executeUpdate("delete from asignacion_academica where codigo_espacio='"+codigoEspacio+"' and nombre_usuario='"+nombreUsuario+"';");
            stm.executeUpdate("delete from calificacion where codigo_espacio='"+codigoEspacio+"' and nombre_usuario='"+nombreUsuario+"';");
            stm.executeUpdate("delete from asignacion_espacio where codigo_espacio='"+codigoEspacio+"' and nombre_usuario='"+nombreUsuario+"';");
            stm.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public void eliminarCurso(String codigo){
        //PRIMERO VERIFICAR SI SE PUEDE ELIMINAR
        try {
            Connection c = con.getConnection();
            Statement stm = c.createStatement();
            //borrar de recurso y asignacion_recurso.
            stm.executeUpdate("delete from calificacion where codigo_espacio='"+codigo+"';");
            stm.executeUpdate("delete from asignacion_criterio where codigo_espacio='"+codigo+"';");
            stm.executeUpdate("delete from preferencias_espacio where codigo_espacio='"+codigo+"';");
            stm.executeUpdate("delete from asignacion_academica where codigo_espacio='"+codigo+"';");
            stm.executeUpdate("delete from asignacion_funcion where codigo_espacio='"+codigo+"';");
            stm.executeUpdate("delete from asignacion_espacio where codigo_espacio='"+codigo+"';");
            stm.executeUpdate("delete from asignacion_foro where codigo_espacio='"+codigo+"';");
            stm.executeUpdate("delete from foro where codigo_espacio='"+codigo+"';");
            stm.executeUpdate("delete from preferencias_academicas where codigo_espacio='"+codigo+"';");
            stm.executeUpdate("delete from espacio_curso where codigo_espacio='"+codigo+"';");
            stm.executeUpdate("delete from espacio_curso where codigo_espacio='"+codigo+"';");
            stm.close();
            //c.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public boolean actualizarUsuario(Usuario us){
        boolean res;
        try {
            Connection c = con.getConnection();
            //falta actualizar el CI.
            PreparedStatement stm = c.prepareStatement("update usuario set nombre_completo=?,email_usuario=?,descripcion_usuario=? where nombre_usuario=?;");
            stm.setString(1, us.getNombreCompleto());
            stm.setString(2, us.getEmailUsuario());
            stm.setString(3, us.getDescripcionUsuario());
            stm.setString(4, us.getNombreUsuario());
            stm.executeUpdate();

            stm.close();
            //c.close();
            res = true;
        } catch (Exception ex) {
            ex.printStackTrace();
            res = false;
        }
        return res;
    }
    
    public boolean actualizarCurso(EspacioCurso e){
        boolean res;
        try {
            Connection c = con.getConnection();
            Statement stm = c.createStatement();
            stm.executeUpdate("update espacio_curso set nombre_espacio='"+e.getNombreEspacio()+"', descripcion_espacio='"+e.getDescripcionEspacio()+"' where codigo_espacio='"+e.getCodigoEspacio()+"';");

            stm.close();
            //c.close();
            res = true;
        } catch (Exception ex) {
            ex.printStackTrace();
            res = false;
        }
        return res;
    }
    //REVISADO HASTA AQUI.
    
    public Usuario obtenerUsuario(String nom){
        Usuario u = null;
        try {
            Connection c = con.getConnection();
            Statement stm = c.createStatement();
            ResultSet rs = stm.executeQuery("select * from usuario where nombre_usuario='"+nom+"';");
            rs.next();
            u = new Usuario(nom, "Encrypted", rs.getString("nombre_completo"),rs.getString("email_usuario"),rs.getString("descripcion_usuario"));

            
            rs.close();
            stm.close();
            //c.close();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return u;
    }
    
    public EspacioCurso obtenerCurso(String codigoCurso,String username){
        EspacioCurso res = new EspacioCurso();
        
        ArrayList<EspacioCurso> cursos = listarCursos(username);
        for(EspacioCurso c:cursos){
            if(c.getCodigoEspacio().equals(codigoCurso)){
                res = c;
            }
        }
        return res;
    }
    
    /*public void crearRol(Rol r,String codigoEspacio){
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("insert into rol_espacio values(?,DEFAULT,?,?)");
            ps.setString(1, codigoEspacio);
            ps.setString(2, r.getNombreRol());
            ps.setString(3, r.getDescripcionRol());
            ps.executeUpdate();
            
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }*/
    
    
    
    
    
    public ArrayList<Usuario> listarDocentes(){
        ArrayList<Usuario> docentes = new ArrayList<Usuario>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from usuario u,docente d where u.nombre_usuario=d.nombre_usuario");
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                docentes.add(new Usuario(rs.getString("nombre_usuario"), "Encrypted", rs.getString("nombre_completo"), rs.getString("email_usuario"), rs.getString("descripcion_usuario")));
            }
            rs.close();
            ps.close();
            //c.close();
            
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return docentes;
    }
    
    public ArrayList<Widget> recuperarPreferencias(String codigoEspacio){
        ArrayList<Widget> ws = new ArrayList<Widget>();
        try {
            Connection c= con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from espacio_curso e,preferencias_espacio pe where e.codigo_espacio=pe.codigo_espacio and e.codigo_espacio=?;");
            ps.setString(1, codigoEspacio);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                ws.add(new Widget(rs.getString("nombre_widget"), rs.getInt("estado"), rs.getString("valor_opcional")));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return ws;
    }
    public void guardarPreferenciasCurso(String codigoCurso,ArrayList<Widget> widgets){
        try {
            Connection c = con.getConnection();
            for(Widget w:widgets){
                PreparedStatement ps = c.prepareStatement("update preferencias_espacio set estado=?, valor_opcional=? where codigo_espacio=? and nombre_widget=?;");
                ps.setInt(1, w.getEstado());
                ps.setString(2, w.getValor());
                ps.setString(3, codigoCurso);
                ps.setString(4, w.getNombre());
                ps.executeUpdate();
                ps.close();
            }
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public ArrayList<Widget> listarWidgets(){
        ArrayList<Widget> res = new ArrayList<Widget>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from widget;");
            ResultSet rs = ps.executeQuery();
            
            while(rs.next()){
                res.add(new Widget(rs.getString("nombre_widget"), 1, "BIENVENIDO AL ESPACIO"));
            }
            rs.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public Rol obtenerRol(String codigoRol){
        Rol res=null;
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from rol where codigo_rol=?;");
            ps.setString(1, codigoRol);
            ResultSet rs = ps.executeQuery();
            if(rs.next()){
                res = new Rol(rs.getString("codigo_rol"), rs.getString("nombre_rol"), rs.getString("descripcion_rol"));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return  res;
    }
    
    public ArrayList<Usuario> listarUsuariosPorRol(String codigoEspacio,String codigoRol){
        ArrayList<Usuario> res = new ArrayList<Usuario>();
        
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from usuario u,asignacion_espacio ae where u.nombre_usuario=ae.nombre_usuario and ae.codigo_espacio=? and ae.codigo_rol=?;");
            ps.setString(1, codigoEspacio);
            ps.setString(2, codigoRol);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res.add(new Usuario(rs.getString("nombre_usuario"),"Encrypted with SHA", rs.getString("nombre_completo")));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        
        return res;
    }
    
    //nombre_usuario,codigo_materia,numero_grupo,codigo_carrera,codigo_espacio,codigo_grupo_espacio,codigo_rol
    public void inscribir(String codigoEspacio,String codigoRol,ArrayList<Usuario> usuarios)throws Exception{
        String msg =  "";
        try {
        Connection c = con.getConnection();
        Statement stm = c.createStatement();
        /*stm.executeUpdate("delete from asignacion_funcion where codigo_espacio='"+codigoEspacio+"' and codigo_rol='Estudiante';");
        stm.executeUpdate("delete from asignacion_espacio where codigo_espacio='"+codigoEspacio+"' and codigo_rol='Estudiante';");*/
        //falta borrar notas.
        stm.close();
        
        PreparedStatement ps = c.prepareStatement("insert into asignacion_espacio values(?,?,?);");
        for(Usuario u:usuarios){
            if(!existeUsuario(u)){
                registrarUsuario(u);
            }
            if(!estaInscrito(u.getNombreUsuario(),codigoEspacio)){
                ps.setString(1, u.getNombreUsuario());
                ps.setString(2, codigoEspacio);
                ps.setString(3, codigoRol);
                ps.executeUpdate();
            }else{
                msg += "YA ESTA INSCRITO " + u.getNombreUsuario() + "\n";
            }
        }
        ps.close();
        //c.close();
        if(!msg.equals("")) throw new Exception(msg);
        } catch (Exception ex) {
            ex.printStackTrace();
            if(!msg.equals("")) throw new Exception(msg);
        }
    }
    
    public void inscribir(String codigoEspacio,String codigoRol,ArrayList<Usuario> usuarios,String codigoCarrera,String codigoMateria,String numeroGrupo)throws Exception{
        String msg = "";
        try {
        Connection c = con.getConnection();
        Statement stm = c.createStatement();
        /*stm.executeUpdate("delete from asignacion_funcion where codigo_espacio='"+codigoEspacio+"';");
        stm.executeUpdate("delete from asignacion_academica where codigo_espacio='"+codigoEspacio+"';");
        stm.executeUpdate("delete from asignacion_espacio where codigo_espacio='"+codigoEspacio+"' and codigo_rol='Estudiante';");*/
        //falta borrar notas.
        
        
        PreparedStatement ps = c.prepareStatement("insert into asignacion_espacio values(?,?,?);");
        PreparedStatement pss = c.prepareStatement("insert into asignacion_academica values(?,?,?,?,?,?);");
        for(Usuario u:usuarios){
            if(!existeUsuario(u)){
                registrarUsuario(u);
            }
            if(!estaInscrito(u.getNombreUsuario(),codigoEspacio)){
                ps.setString(1, u.getNombreUsuario());
                ps.setString(2, codigoEspacio);
                ps.setString(3, codigoRol);
                ps.executeUpdate();

                stm.executeUpdate("delete from asignacion_academica where nombre_usuario='"+u.getNombreUsuario()+"';");
                pss.setString(1, u.getNombreUsuario());
                pss.setString(2, codigoEspacio);
                pss.setString(3, codigoMateria);
                pss.setString(4, codigoCarrera);
                pss.setString(5, codigoEspacio);
                pss.setString(6, numeroGrupo);
                pss.executeUpdate();
            }else{
                msg += "EL USUARIO " + u.getNombreUsuario() + " YA ESTA INSCRITO\n";
            }
        }
        stm.close();
        ps.close();
        //c.close();
        if(!msg.equals("")) throw new Exception(msg);
        } catch (Exception ex) {
            ex.printStackTrace();
            if(!msg.equals("")) throw new Exception(msg);
        }
    }
    
    public boolean estaInscrito(String nombreUsuario,String codigoEspacio){
        boolean res = false;
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from asignacion_espacio where codigo_espacio=? and nombre_usuario=?;");
            ps.setString(1, codigoEspacio);
            ps.setString(2, nombreUsuario);
            ResultSet rs = ps.executeQuery();
            res = rs.next();
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public ArrayList<Usuario> listarUsuarios(String codigoEspacio){
        ArrayList<Usuario> res = new ArrayList<Usuario>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from usuario u,asignacion_espacio ae where ae.codigo_espacio=?;");
            ps.setString(1, codigoEspacio);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res.add(new Usuario(rs.getString("nombre_usuario"),"Encrypted with SHA",rs.getString("nombre_completo")));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public boolean existeUsuario(Usuario u){
        boolean res = false;
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from usuario where nombre_usuario=?;");
            ps.setString(1, u.getNombreUsuario());
            ResultSet rs = ps.executeQuery();
            res = rs.next();
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public String obtenerMensajeBienvenida(String codigoEspacio){
        ArrayList<Widget> ws = recuperarPreferencias(codigoEspacio);
        String res = "";
        for(Widget w :ws){
            if(w.getNombre().equals("bienvenida")){
                res = w.getValor();
                break;
            }
        }
        return res;
    }
    
    public ArrayList<Materia> listarMateriasDocente(String codigoDocente){
        ArrayList<Materia> mts = new ArrayList<Materia>();
        
        try {
            /*Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from asignacion_materia am,materia m where am.codigo_materia=m.codigo_materia and am.nombre_usuario=?;");
            ps.setString(1, codigoDocente);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                mts.add(new Materia(rs.getString("codigo_materia"), rs.getString("nombre_materia"), rs.getString("descripcion_materia")));
            }
            
            ps.close();
            rs.close();
            //c.close();*/
            mts = listarMaterias();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return mts;
    }
    
    public void crear(){
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from espacio;");
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                crearPreferenciasCurso(rs.getString("codigo_espacio"), listarWidgets());      
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public void asignar(){
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from asignacion_espacio where codigo_rol='Responsable';");
            ResultSet rs = ps.executeQuery();
            //ArrayList<Funcion> funcs = listarFuncionesPredeterminadas("Responsable");
            ArrayList<Funcion> funcs = new ArrayList<Funcion>(); funcs.add(new Funcion("FUNC13", "", ""));
            PreparedStatement psr = c.prepareStatement("insert into asignacion_funcion values(?,?,?);");
            while(rs.next()){
                for(Funcion f : funcs){
                psr.setString(1, rs.getString("nombre_usuario"));
                psr.setString(2, rs.getString("codigo_espacio"));
                psr.setString(3, f.getCodigoFuncion());
                psr.executeUpdate();
            }
            }
            psr.close();
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    

    public String obtenerCreador(String codigoEspacio){
        String res="";
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from asignacion_espacio where codigo_rol='Responsable' and codigo_espacio=?;");
            ps.setString(1, codigoEspacio);
            ResultSet rs = ps.executeQuery();
            if(rs.next()) res = rs.getString("nombre_usuario");
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    public boolean esDocente(String nombreUsuario){
        boolean res = false;
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from docente where nombre_usuario=?;");
            ps.setString(1, nombreUsuario);
            ResultSet rs = ps.executeQuery();
            res = rs.next();
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public boolean esResponsable(String codigoEspacio,String nombreUsuario){
        boolean res = false;
        try {
            String creador = obtenerCreador(codigoEspacio);
            if(nombreUsuario.equals(creador)){
                res = true;
            }else{
                res = false;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    /*============NEWS=============*/
    
    public ArrayList<Funcion> listarFuncioneConfigurables(){
        ArrayList<Funcion> res = new ArrayList<Funcion>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from funcion where nombre_categoria<>'RESPONSABLE';");
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res.add(new Funcion(rs.getString("codigo_funcion"), rs.getString("nombre_funcion"), rs.getString("descripcion_funcion"), rs.getString("link_funcion"), rs.getString("nombre_categoria")));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public ArrayList<Usuario> listarUsuarios(String codigoEspacio,String codigoRol,ArrayList<GrupoAcademico> grupos){
        ArrayList<Usuario> res = new ArrayList<Usuario>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select distinct(nombre_usuario) from asignacion_academica where codigo_espacio=? and codigo_carrera=? and codigo_materia=? and numero_grupo=?;");
            PreparedStatement pss = c.prepareStatement("select * from asignacion_espacio where codigo_espacio=? and nombre_usuario=? and codigo_rol=?;");
            for(GrupoAcademico g:grupos){
                ps.setString(1, codigoEspacio);
                ps.setString(2, g.getCodigoCarrera());
                ps.setString(3, g.getCodigoMateria());
                ps.setString(4, g.getNumeroGrupo());
                ResultSet rs = ps.executeQuery();
                while(rs.next()){
                    String nombreUsuario = rs.getString("nombre_usuario");
                    pss.setString(1, codigoEspacio);
                    pss.setString(2, nombreUsuario);
                    pss.setString(3, codigoRol);
                    ResultSet rss = pss.executeQuery();
                    if(rss.next()){
                        res.add(obtenerUsuario(nombreUsuario));
                    }
                    rss.close();
                }
                rs.close();
            }
            pss.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    /**
     * Asigna una funcion a un grupo de usuarios, borra las anteriores asignaciones.
     * @param codigoEspacio El codigo del espacio.
     * @param codigoFuncion La funcion que se quiere asignar.
     * @param usuarios Los codigos de los usuarios que se quiere asignar.
     **/
    public void asignarFuncionUsuarios(String codigoEspacio,String codigoFuncion,ArrayList<String> usuarios){
        try {
            Connection c = con.getConnection();
            Statement stm = c.createStatement();
            stm.executeUpdate("delete from asignacion_funcion where codigo_espacio='"+codigoEspacio+"' and codigo_funcion='"+codigoFuncion+"';");
            PreparedStatement ps = c.prepareStatement("insert into asignacion_funcion values(?,?,?);");
            for(String user:usuarios){
                ps.setString(1, user);
                ps.setString(2, codigoEspacio);
                ps.setString(3, codigoFuncion);
                ps.executeUpdate();
            }
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public ArrayList<Usuario> listarUsuariosGrupo(String codigoEspacio,String codigoRol,GrupoAcademico grupo){
        ArrayList<Usuario> res = new ArrayList<Usuario>();
        ArrayList<String> usr = GestorCriteriosDB.getInstance().listarUsuariosGrupo(codigoEspacio, grupo);
        for(String nombreUsuario:usr){
            res.add(obtenerUsuario(nombreUsuario));
        }
        return res;
    }
    
    public ArrayList<Usuario> listarUsuariosFuncion(String codigoEspacio,String codigoFuncion){
        ArrayList<Usuario> res = new ArrayList<Usuario>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select distinct(nombre_usuario) from asignacion_funcion where codigo_espacio=? and codigo_funcion=?;");
            ps.setString(1, codigoEspacio);
            ps.setString(2, codigoFuncion);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res.add(obtenerUsuario(rs.getString("nombre_usuario")));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public ArrayList<Categoria> listarFuncionesCategoria(String nombreUsuario,String codigoEspacio){
        ArrayList<String> cats = listarCategorias();
        ArrayList<Funcion> funcs = listarFuncionesUsuario(codigoEspacio, nombreUsuario);
        ArrayList<Categoria> res = new ArrayList<Categoria>();
        for(String cat:cats){
            ArrayList<Funcion> aux = new ArrayList<Funcion>();
            for(Funcion f:funcs){
                if(cat.equals(f.getCategoria())){
                    aux.add(f);
                }
            }
            if(aux.size()>0) res.add(new Categoria(cat, aux));
        }
        return res;
    }
    
    public ArrayList<String> listarCategorias(){
        ArrayList<String> res = new ArrayList<String>();
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from categoria_funcion;");
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res.add(rs.getString("nombre_categoria"));
            }
            rs.close();
            ps.close();
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    public static GestorEspacioDB getInstance(){
        return new GestorEspacioDB();
    }
    
    public Rol obtenerRolUsuario(String nombreUsuario,String codigEspacio){
        Rol res = null;
        try {
            Connection c = con.getConnection();
            PreparedStatement ps = c.prepareStatement("select * from asignacion_espacio where nombre_usuario=? and codigo_espacio=?;");
            ps.setString(1, nombreUsuario);
            ps.setString(2, codigEspacio);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                res = obtenerRol(rs.getString("codigo_rol"));
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return res;
    }
    
    //es muy importante borrar este metodo.
    public void borrar(){
        try{
        Connection c = con.getConnection();
        for(int i = 0;i<50;i++){
        PreparedStatement ps = c.prepareStatement("select * from materia;");
        ResultSet rs = ps.executeQuery();
        if(rs.next()){
            System.out.println(rs.getString(1)+rs.getString(2)+rs.getString(3));
            for(int j = 0;j<100;j++){
                PreparedStatement pss = c.prepareStatement("select * from usuario");
                ResultSet rss = pss.executeQuery();
                while(rss.next()){
                    System.out.println("\t"+rss.getString(2));
                }
            }
        }
        
        rs.close();
        ps.close();
        }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
    public void borrar2(Connection c,int count){
        try {
            if(count>0){
                PreparedStatement ps = c.prepareStatement("select * from rol;");
                ResultSet rs = ps.executeQuery();
                while(rs.next()){
                    String res = rs.getString(2);
                    borrar2(c, count-1);
                }
                System.out.println("FIN NIVEL: " + count);
                rs.close();
                ps.close();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        GestorEspacioDB database = getInstance();
        
        /*Usuario us = new Usuario("juampi", ".juampi.", "JP", "jp@gmail.com", "Estudiante TIS");
        us = new Usuario("leticia", ".leticia.", "LB", "lb@gmail.com", "Docente");
        database.registrarDocente(us);
        us = new Usuario("rosemary", ".rosemary.", "RS", "rs@gmail.com", "Docente");
        database.registrarDocente(us);
        us = new Usuario("costas", ".costas.", "VC", "vc@gmail.com", "Docente");
        database.registrarDocente(us);
        us = new Usuario("arias", ".arias.", "JA", "ja@gmail.com", "Docente");
        database.registrarDocente(us);*/
        //database.registrarUsuario(us);
        //System.out.println(database.login("rodrigo", ".rodrigo."));
        EspacioCurso ec = new EspacioCurso("my space", new java.util.Date(), "sin desc");
        //database.crearEspacioCurso(us, ec);
        //System.out.println(database.listarFuncionesUsuario("ESP5", "juampi").size());
        //System.out.println(database.listarGruposEspacio("ESP4","419701","INF135"));
        //System.out.println(database.listarRoles().size());
        
        /*ArrayList<GrupoAcademico> gs = new ArrayList<GrupoAcademico>();
        gs.add(new GrupoAcademico("378501", "INF235", "2"));
        database.asignarDatosEspacio("ESP5", gs);*/
        /*ArrayList<Usuario> usr = new ArrayList<Usuario>();
        usr.add(new Usuario("osmar", ".osmar.", "Osmar Bravo","o@o", "sin desc"));
        database.inscribir("ESP5", "Estudiante", usr,"419701", "INF235", "5");*/
        
        //System.out.println(database.buscarUsuarios("ESP16","200111122", "1111").get(0).getNombreUsuario());
        /*ArrayList<GrupoAcademico> grupos = new ArrayList<GrupoAcademico>();
        grupos.add(new GrupoAcademico("419701", "2010010", "2"));
        grupos.add(new GrupoAcademico("378501", "2010010", "2"));
        System.out.println(database.listarUsuarios("ESP16", "Estudiante", grupos).size());*/
        /*try {
            Connection c = new Coneccion().getConnection();
            database.borrar2(c, 90);    
            //c.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }*/
        //System.out.println(database.listarUsuariosFuncion("ESP16", "FUNC8").size());
        /*ArrayList<String> usuarios = new ArrayList<String>();
        usuarios.add("200501364");
        usuarios.add("200501666");
        usuarios.add("200502626");
        database.asignarFuncionUsuarios("ESP16", "FUNC8", usuarios);*/
        //System.out.println(database.listarFuncionesUsuario("ESP16", "200111122").get(0).getCategoria());
        //System.out.println(database.listarFuncionesCategoria("200111122", "ESP16").get(0).getFunciones());
        //System.out.println(database.obtenerRolUsuario("200501600", "ESP45").getNombreRol());
    }
}
